// // enum Sex {
// //   '男',
// //   '女'
// // }
// // // Sex['男']
// // // Sex[1]
// // console.log(Sex[0])
// let arr:number[] = []
// //arr.push('1')//报错
// let object:object = {}
// //object = 123//报错
// //object = '123'//报错
// //object = null//不报错
// //object = undefined//不报错
// // obj = new Number(12)
// //没有指定类型的时候推断出来一个类型
// let t = 123//推断为一个number类型
// //t = ‘1’//报错
// let b;//没有赋值的时候推断为any类型
// b = {}
// b = 1
// b = '1'

// let c:number | string = '123'
// c = 123

// // interface Person {
// //   name: string
// //   age?: number//可选属性
// // }
// // let p1:Person = {
// //   name: 'string'
// // }//报错缺少age类型
// // interface Student {
// //   age:number,
// //   [props: string]:string //设置任意属性之后，上面的属性也会被影响
// // }
// // let s1:Student = {
// //   age: 123,
// //   //age: 123//报错，任意属性为string类型
// // }
// // interface IPerson {
// //   readonly IdCard: string//只读属性
// //   name: string
// // }
// // let p2:IPerson = {
// //   name: '123',
// //   IdCard:'123123'
// // }
// //p2.IdCard = '222'//报错
// interface IFunc {
//   //(参数：类型):返回值类型
//   (a:number,b:number): number
// }
// const func:IFunc = function(a,b):number{
//   return a+b
// }
// function add(a:number,b?:number,c:number=3):number{
//   return a+c
// }//报错
// add(1)
// function sum(a,b,c,...args:number[]) {
//   console.log(a,b,c,args)
// }
// sum(1,2,3,4,54,6,7,78)

// // function getLength(a:string|number):number{
// //   return (a as string).length
// // }
// function getLength(a:string|number):number{
//   // return (a as string).length
//   return (<string>a).length
// }
// type paramType = string|number
//   function addFun(x:paramType,y:paramType):paramType | void {
//     if(typeof x === 'string' && typeof y === 'string') {
//       return x+y
//     } else if(typeof x === 'number' && typeof y === 'number') {
//       return x+y
//     }
//   }

//   let Tarr:[string,number] = ['1',222]//数据类型与位置以及元素个数进行确定
//   Tarr.push(1)
//   Tarr.push('222')
//   // Tarr.push(boolean)//报错
//   // enum NumberEnum{
//   //   '一' = 2,
//   //   '二' = 1,
//   //   '三' = '123'.length,
//   //   '四'
//   // }
// // class Person {
// //   name: string
// //   age: number
// //   constructor(name:string, age:number) {
// //     this.name = name
// //     this.age = age
// //   }
// //   setName(str:string){
// //     this.name = str
// //   }
// // }
// // class Student extends Person{
    
// // }

// class Name{
//   fName:string
//   lName: string
//   constructor(fName:string, lName: string){
//     this.fName = fName
//     this.lName = lName
//   }
//   get name() {//只读属性
//     return `${this.fName}-${this.lName}`
//   }
//   set name(val: string) {
//     let nameArr = val.split('-')
//     this.fName = nameArr[0] || ''
//     this.lName = nameArr[1] || ''
//   }
//  }
//  let n1 = new Name('刘','德华')
//  console.log(n1, n1.name)
//  //n1.name = '张学友'//报错，只读属性,set修饰之后可以修改操作
//  n1.name = '张-学友'
//  interface ISetName{
//   name: string
//   setName:(name: string)=>void
// }
// interface ISetAge{
//   setAge()
// }
// class Person implements ISetName,ISetAge{
//   name: string
//   setName(str) {
//     this.name = str
//   }
//   setAge() {
    
//   }
// }
// function getValue<T>(a:T):T{
//   return a
// }
// getValue(1)
// getValue('1')
// getValue<number>(1)
// function reverse<T,U>(a:[T,U]):[U,T]{
//   return [a[1],a[0]]
// }
// // function getLengthNum<T>(a:T):number {
// //   return a.length
// // }
// interface ILength {
//   length: number
// }
// function getLengthNum<T extends ILength>(a:T):number{
//   return a.length
// }
// //getLengthNum(1)//报错，number类型没有length
// interface IArr{
//   <T>(value:T,count:number):T[]
// }
// let getArr:IArr = function<T>(value:T,count:number):T[] {
//   const arr:T[] = []
//   for(let i = 0;i<count;i++) {
//     arr.push(value)
//   }
//   return arr
// }


// let a:number = 123
// // a = '123'


// let b1:null = null
// // b1 = 123
// // let b3:null = '123'
// let arr1:number[] = [123]
// let arr2:Array<string> = ['12','23']
// // arr2 = {}
// let b3 = true
// // b3 = ''
// let b4
// b4 = 122
// b4 = '123'
// let obj1:object = {}
// //字面量方式赋值报错
// // obj1 = 123//报错
// // obj1 = '123'//报错
// // obj1 = null//不报错
// // obj1 = undefined//不报错
// obj1 = new Number(12)//不报错
// obj1 = new String('123')//不报错
// // function func1():void {
// //   // return 123
// // }

// let b5: string | number = 123

// interface IPerson {
//   name: string
//   age?: number,
//   readonly idCard: string
//   // [props:string]:string
// }
// let p5:IPerson = {
//   name: '123',
//   age: 123,
//   idCard: '123'
// }
// // p5.idCard = '111'
// interface IGetDataFunc{
//   (a: string,b:string): string
// }

// function getData(a:string,b:string='123',c:string,...args:number[]):void {
//   console.log(a,b,c,args)
// }
// let getData1:IGetDataFunc  = function(a:string,b:string): string {
//   return a+b
// }
// getData('1','2','3',1,2,3,4,5,6)
// // let obj5:IGetDataFunc = {
// //   name: '123'
// // }
// // function addFunc(x: string,y:string):string
// // function addFunc(x:number, y:number): number
// type paramT = string | number
// function addFunc(x: paramT,y:paramT): paramT | void{
//   if(typeof x === 'string' && typeof y === 'string') {
//     return x+y
//   } else if(typeof x === 'number' && typeof y === 'number') {
//     return x+y
//   }
// }
// //传进来的无论是字符串还是数字，都要返回他的长度
// // 类型断言
// function getLengthFun(a:number|string) {
//   //return (a as string).length
//   return (<string>a).length
// }

// type s = string
// let str:s = '123'
// let Tarray:[string,number,boolean] = ['1',222,true]
// Tarray.push(1)
// Tarray.push('222')
// Tarray.push(false)//报错

// enum EData {
//   '周一'=2,
//   '周二'= 1,
//   '周三' = '123'.length,
//   '周四' = '123'
// }

// class PersonClass {
//   name: string
//   age: number
//   constructor(name:string, age:number) {
//     this.name = name //不预先定义class属性会报错
//     this.age = age
//   }
//   setName(str:string):void{
//     this.name = str
//   }
//  }
//  class Student extends PersonClass{
//   constructor(name:string, age:number) {
//     super(name,age)//super调用父类构造方法，属性和方法继承
//   }
//   //也可以重写父类的方法
//   setName(str:string) {
//     this.name = name+'1'
//   }
//  }
class NameClass{
  fName:string
  lName: string
  constructor(fName:string, lName: string){
    this.fName = fName
    this.lName = lName
  }
  get name() {//只读属性
    console.log('get')
    return `${this.fName}-${this.lName}`
  }
  set name(val: string) {
    let nameArr = val.split('-')
    this.fName = nameArr[0] || ''
    this.lName = nameArr[1] || ''
  }
 }
 let n1 = new NameClass('张','学友')
 console.log(n1)
 console.log(n1.name)
 n1.name = '黎-明'
 console.log(n1)

 abstract class Animal {
  public name;
  constructor(name) {
    this.name = name;
  }
  abstract getName()
}
class Cat extends Animal {
  readonly age: number
  constructor(name,age) {
    super(name);
    this.age = age

  }
  getName() {

  }
}

let a = new Cat('Jack',30);
// a.age = 50

interface ISetName{
  setName()
}
interface ISetName{
  setAge()
}
class Person implements ISetName{
  setName() {
      
  }
  setAge() {
      
  }
}
// class Person {
//   name: string
//   age: string
// }

function getValue<T>(a:T):T{
  return a
}
getValue('123')
getValue<string>('')

function reverse<T, U>(p:[T,U]):[U,T] {
  return [p[1],p[0]]
}

interface IT {
  length:number
}
function getLength<T extends IT>(a:T):number {
  return a.length //报错，T类型不确定有length属性
}
// getLength(123)
interface IArr{
  <T>(value:T,count:number):T[]
}
interface IArray<T>{
  (value:T, count:number):T[],
  name: T
}